const { check, body, validationResult } = require("express-validator");
const ApiError = require("../exceptions/api-error");

exports.validateRegistration = [
  check("email").not().isEmpty().withMessage("Поле email не может быть пустым"),
  check("email").isString().withMessage("Поле должен быть строкой"),
  check("email").isEmail().withMessage("Некорректный email"),
  check("email")
    .matches(/[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+/)
    .withMessage(
      "Должен содержать только латинские буквы и цифры. Например: 9XUZMMM@example.com"
    ),
  check("password")
    .not()
    .isEmpty()
    .withMessage("Поле password не может быть пустым"),
  check("password")
    .isLength({ min: 6, max: 32 })
    .withMessage("Пароль дожен содержать от 6 до 32 символов"),
  check("password").isString().withMessage("Пароль должен быть строкой"),
  check("password")
    .matches(
      /(?=.*[0-9])(?=.*[!@#$%^&*])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z!@#$%^&*]/
    )
    .withMessage(
      "Пароль должен содержать только латинские буквы хотя бы одну цифру, одну букву в верхнем регистре и одну букву в нижнем регистре"
    ),
  (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return next(
        ApiError.badRequest(
          "Ошибка валидации полей регистрации",
          errors.array()
        )
      );
    }
    next();
  },
];
exports.validateLogin = [
  check("email").not().isEmpty().withMessage("Поле email не может быть пустым"),
  check("email").isString().withMessage("Поле должен быть строкой"),
  check("email").isEmail().withMessage("Некорректный email"),
  check("email")
    .matches(/[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+/)
    .withMessage(
      "Должен содержать только латинские буквы и цифры. Например: 9XUZMMM@example.com"
    ),
  check("password")
    .not()
    .isEmpty()
    .withMessage("Поле password не может быть пустым"),
  check("password")
    .isLength({ min: 6, max: 32 })
    .withMessage("Пароль дожен содержать от 6 до 32 символов"),
  check("password").isString().withMessage("Пароль должен быть строкой"),
  check("password")
    .matches(
      /(?=.*[0-9])(?=.*[!@#$%^&*])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z!@#$%^&*]/
    )
    .withMessage(
      "Пароль должен содержать только латинские буквы хотя бы одну цифру, одну букву в верхнем регистре и одну букву в нижнем регистре"
    ),
  (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return next(
        ApiError.badRequest(
          "Ошибка валидации полей авторизации",
          errors.array()
        )
      );
    }
    next();
  },
];

exports.validateEmail = [
  check("email").not().isEmpty().withMessage("Поле email не может быть пустым"),
  check("email").isString().withMessage("Поле должен быть строкой"),
  check("email").isEmail().withMessage("Некорректный email"),
  check("email")
    .matches(/[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+/)
    .withMessage(
      "Должен содержать только латинские буквы и цифры. Например: 9XUZMMM@example.com"
    ),
  (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return next(
        ApiError.badRequest("Ошибка валидации поля email", errors.array())
      );
    }
    next();
  },
];
// Проверка, что email не пустой
// check("email").not().isEmpty().withMessage("Поле email не может быть пустым"),
// (req, res, next) => {
//   const errors = validationResult(req);
//   if (!errors.isEmpty()) {
//     // Возвращаем ошибку, если поле email пустое
//     return next(ApiError.badRequest(errors.array()[0].msg), errors.array());
//   }
//   next();
// },
// Проверка, что email соответствует формату email
// check("email").isEmail().withMessage("Некорректный email"),
// (req, res, next) => {
//   const errors = validationResult(req);
//   if (!errors.isEmpty()) {
//     // Возвращаем ошибку, если email некорректный
//     const errorMessages = errors.array().map((err) => err.msg);
//     // Проверяем, существует ли уже сообщение об ошибке пустого поля
//     if (errorMessages.includes("Поле не может быть пустым")) {
//       next(); // Пропускаем, так как ошибка уже была обработана
//     } else {
//       return next(ApiError.badRequest(errors.array()[0].msg));
//     }
//   }
//   next();
// },
// check("password")
//   .not()
//   .isEmpty()
//   .withMessage("Поле password не может быть пустым"),
// (req, res, next) => {
//   const errors = validationResult(req);
//   if (!errors.isEmpty()) {
//     return next(ApiError.badRequest(errors.array()[0].msg));
//   }
//   next();
// },
// check("password")
//   .isLength({ min: 3, max: 32 })
//   .withMessage("Пароль дожен содержать от 3 до 32 символов"),
// (req, res, next) => {
//   const errors = validationResult(req);
//   if (!errors.isEmpty()) {
//     return next(ApiError.badRequest(errors.array()[0].msg));
//   }
//   next();
// },

// exports.validateRegistration = [
//   check("email").not().isEmpty().withMessage("Поле не может быть пустым"),
//   check("email").isEmail().withMessage("Некорректный email"),
//   (req, res, next) => {
//     const errors = validationResult(req);
//     // if (!errors.isEmpty()) {
//     //   if (errors.array()[0].msg) {
//     //     return next(ApiError.badRequest(errors.array()[0].msg));
//     //   } else {
//     //     return next(ApiError.badRequest(errors.array()[1].msg));
//     //   }
//     // }
//     //next();
//     if (!errors.isEmpty()) {
//       // Создаем объект ошибки с первым сообщением из списка ошибок
//       const errorMessage = errors
//         .array()
//         .map((err) => err.msg)
//         .join(", ");
//       //   return next(
//       //     ApiError.badRequest(
//       //       "Ошибка валидации",
//       //       errors.array().map((err) => err.msg)
//       //     )
//       //   );
//       return next(ApiError.badRequest(errorMessage));
//     }
//     next();
//   },
// ];
